package jvm;

/**
 * @Author:ycz
 * @date:2021/7/19
 *
 * https://blog.csdn.net/qq_43631716/article/details/115611129
 *
 * 类加载的阶段
 *  加载==》1、通过类的全限定名获取存储该类的class文件
 *          2、解析成运行时数据，即instanceKlass实例，存放在方法区
 *          3、在堆区生成该类的class对象，即instanceMirrorKlass实例
 *          何时触发加载？？？
 *          1、new、getstatic、putstatic、invokestatic
 *          2、反射
 *          3、初始化一个类的子类会去加载其父类
 *          4、启动类（main函数所在类）
 *          5、动态语言支持的，如果一个java.lang.invoke.MethodHandle时立的解析结果返回
 *          REF_getstatic,REF_putstatic,REF_invokestatic的方法句柄，
 *          并且句柄对于的类没有进行初始化，则需要触发其初始化
 *  连接（验证、准备、解析）
 *  初始化==》执行类的静态代码块，可能会产生死锁
 *  、使用、卸载
 *
 *  关于JVM的知识
 *  1、类的属性存储问题
 *      存储在原空间（方法区）的Array[] fields;属性下，所以str存储在fields下
 *
 *  2、访问静态属性的底层实现
 *  getstatic、putstatic、invokestatic
 *
 *  3、加载与初始化（实例化、初始化）
 *
 *
 *
 *
 */
public class StaticTest1 {

    public static class B extends A{
        static {
            // 不会被打印
            System.out.println("this is B class");
        }
    }

    public static class A{
        public static String str = "A str";
        static {
            System.out.println("this is A class");
        }
    }

    static {
        System.out.println("this is StaticTest1 class");
    }

    public static void main(String[] args) {
        System.out.println(B.str);
    }

}
